001 /*
002 * Copyright 2005 Stephen McConnell
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
013 * implied.
014 *
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018
019 package net.dpml.transit.tools;
020
021 import java.io.File;
022 import java.net.URI;
023 import java.net.URL;
024 import java.net.URLConnection;
025
026 import net.dpml.transit.Artifact;
027
028 import org.apache.tools.ant.BuildException;
029 import org.apache.tools.ant.Project;
030
031 /**
032 * The get task handles the retrival of a rresource and the binding of the resource filename
033 * to a project property.
034 *
035 * @author <a href="http://www.dpml.net">Digital Product Meta Library</a>
036 * @version 1.0.2
037 */
038 public class GetTask extends TransitTask
039 {
040 /**
041 * The uri of the artifact to load.
042 */
043 private String m_uri;
044
045 /**
046 * The name of a property under which the locally cached artifact filename will be bound.
047 */
048 private String m_name;
049
050 /**
051 * Set the project.
052 * @param project the current project
053 */
054 public void setProject( Project project )
055 {
056 setTaskName( "get" );
057 super.setProject( project );
058 }
059
060 /**
061 * Set the artifact uri of the plugin from which the task is to be loaded.
062 * @param uri an artifact plugin uri
063 */
064 public void setUri( String uri )
065 {
066 m_uri = uri;
067 }
068
069 /**
070 * Set the name of a property into which the local file path will be assigned.
071 * @param name the ant property name
072 */
073 public void setProperty( String name )
074 {
075 m_name = name;
076 }
077
078 /**
079 * Return the artifact uri of the plugin.
080 * @return the artifact uri
081 */
082 private URI getURI()
083 {
084 try
085 {
086 return new URI( m_uri.toString() );
087 }
088 catch( Throwable e )
089 {
090 final String error =
091 "Cound not convert the supplied uri spec ["
092 + m_uri
093 + "] to a formal URI.";
094 throw new BuildException( error, e, getLocation() );
095 }
096 }
097
098 /**
099 * Return the ant property name.
100 * @return the property name
101 */
102 private String getPropertyName()
103 {
104 if( null == m_name )
105 {
106 final String error =
107 "The required 'property' attribute is not declared.";
108 throw new BuildException( error, getLocation() );
109 }
110 else
111 {
112 return m_name;
113 }
114 }
115
116 /**
117 * Load the resource and assign the locally cached file path to the supplied property name.
118 * @exception BuildException if an error occurs during resource resolution
119 */
120 public void execute() throws BuildException
121 {
122 if( null == m_uri )
123 {
124 final String error =
125 "Missing uri attribute.";
126 throw new BuildException( error, getLocation() );
127 }
128
129 String name = getPropertyName();
130
131 try
132 {
133 URI uri = getURI();
134 String spec = getURI().toString();
135 log( "artifact: " + spec );
136 URL url = Artifact.toURL( uri );
137 URLConnection connection = url.openConnection();
138 connection.connect();
139 File file = (File) connection.getContent( new Class[]{File.class} );
140 String path = file.getCanonicalPath();
141 getProject().setNewProperty( name, path );
142 }
143 catch( Throwable e )
144 {
145 final String error =
146 "Unexpected error while attempting to resolve artifact uri ["
147 + m_uri
148 + "]";
149 throw new BuildException( error, e, getLocation() );
150 }
151 }
152 }